李守中

Systemd 相关

Table of Contents

1. 系统进程管理 systemctl

1.1. 配置文件相关目录

systemd 的作用是管理系统服务,配置文件大部分放置于 /lib/systemd/system 内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,不建议修改。

修改后的配置文件应在 /etc/systemd/system 内。

举例,vsftpd.service 这个服务:

  • /usr/lib/systemd/system/vsftpd.service: 官方释出的默认配置文件;
  • /etc/systemd/system/vsftpd.service.d/custom.conf: 在 /etc/systemd/system 下创建目录,目录名称为 <service_name>.service.d 格式,再在该目录下创建配置文件。这个目录下的配置文件会 累加其他设置 进入 /lib/systemd/system/vsftpd.service 内。
  • /etc/systemd/system/vsftpd.service.wants/*: 目录内的文件为链接文件,设置相依服务的链接。意为在启动 vsftpd.service 之后 ,再加上这目录下面建议的服务。
  • /etc/systemd/system/vsftpd.service.requires/*: 目录内的文件为链接文件,设置相依服务的链接。意为在启动 vsftpd.service 之前 ,需要先启动哪些服务。

尽管直接改 /lib/systemd/system 文件也有效,但 软件升级时,系统会用新软件包内的新配置文件覆盖旧的配置文件

1.2. .service 文件中以横线开头的命令

比如 nginx.service 文件中有这么一段配置:

[Service]
...
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
...

可以看到,这个命令以 - 横线开头。

这意味着 systemd 会记录那些标志着命令执行失败的程序的退出代码 (即进程返回值非 0 或由于信号导致的退出),但不会产生进一步的影响。同时,忽略这些标志着命令执行失败的程序的返回值,将命令按照执行成功处理。

1.3. 挂载硬盘

/etc/systemd/system/<name>.mount 配置硬盘自动挂载。

这里给一个例子 /etc/systemd/system/mnt-hgst8t2nd.mount:

[Install]
WantedBy=multi-user.target

[Mount]
Options=defaults
Type=ext4
What=/dev/disk/by-uuid/cd2949ed-9e14-4a34-a703-6dcbd761e9d3
Where=/mnt/hgst8t2nd

[Unit]
Description=Mount 2nd HGST 8T disk under /mnt/hgst8t2nd.

systemctl enable --now mnt-hgst8t2nd.mount 可以让硬盘开机自动挂载。

注意:

  1. 必须以 .mount 作为文件名结尾。
  2. .mount 文件的名称必须为 where 字段路径的内容。

比如,例子中 Where 字段为 Where=/mnt/hgst8t2nd 则对应的文件名必须是 mnt-hgst8t2nd.mount

2. 网络管理 systemd-networkd

2.1. 基础配置

systemd-neworkd 在管理多张网卡时,可以使用正则表达式匹配网卡,比如 eth* 匹配 eth0/eth1.../ 等等网卡。在 /etc/systemd/network/00-dhcp.network 配置如下:

[Match]
Name=eth*

[Network]
DHCP=ipv4

[DHCP]
ClientIdentifier=duid

相比 networking 服务默认将网卡的 MAC 地址作为 DHCP 的 Client ID ,systemd-networkd 可以有更多的选择:

  1. mac 表示使用网卡 MAC 地址;
  2. duid 是 **默认值**,表示使用符合 RFC4361 规范的客户端 ID ( 也就是 IAID 与 DUID 的组合 );
  3. duid-only 表示使用 DUID ( 可能与 RFC 规范不兼容,但某些场合需要这样做 )。

2.2. 虚拟机中的 DHCP 客户端标识

在对使用 systemd-networkd 的 KVM 虚拟机进行复制时,如果不对 systemd-networkd 进行配置,即使生成了新的 MAC 地址,路由器可能依旧会给虚拟机分配上次得到的 IP 地址。

这是因为 systemd-networkd 默认使用 duid 作为 DHCP 客户端标识,而 duid 依赖 /etc/machine-id。

所有虚拟机的都是基于同一个原始 qcow2 镜像,而在复制过程中并没有改变 /etc/machine-id 的内容,相当于所有新的虚拟机使用了同一个 /etc/machine-id。最终 DHCP 服务器收到的所有请求来源于同一个 duid,因此分配同样的IP给客户端。

最终的配置要把

[DHCP]
ClientIdentifier=duid

改为:

[DHCP]
ClientIdentifier=mac

3. DNS 管理 systemd-resolved

systemd-resolved 服务在本地的 53 端口建立了一个 DNS stub resolver 服务器。

DNS stub resolver 只把查询转发到上游 DNS,自己不做解析,通常用于在本地主机或网络上引入 DNS 缓存。

在 /etc/systemd/resolvd.conf 设定 DNSStubListener=no 以后可以关闭 DNS stub resolver,这个操作可以解放本机的 53 端口。

systemd-resolved 有四种不同的模式来处理域名解析:

  • systemd-resolved 实时更新 /run/systemd/resolve/stub-resolv.conf 文件以确保兼容传统的 Linux 程序。将软连接 /etc/resolv.conf 指向该文件。该文件将 127.0.0.53 设为唯一的 DNS 服务器,并包含 systemd-resolved 使用的搜索域列表。搜索域列表将会始终保持实时更新。注意,应用程序不应该直接使用 /run/systemd/resolve/stub-resolv.conf 文件,而应该继续使用 /etc/resolv.conf 文件(指向它的软连接)。这样,未使用本地 D-Bus DNS API 的客户端,既可以与 systemd-resolved 通信、又可以正确使用搜索域。**这是推荐用这个方式**。
  • 一个静态 /usr/lib/systemd/resolv.conf 文件, 此文件仅包含一个唯一的 127.0.0.53 DNS 服务器。将软连接 /etc/resolv.conf 指向该静态文件。这样,未使用本地 D-Bus DNS API 的客户端,也可以与 systemd-resolved 通信。此文件不包含任何搜索域。
  • systemd-resolved 实时更新 /run/systemd/resolve/resolv.conf 文件以确保兼容传统的 Linux 程序。将软连接 /etc/resolv.conf 指向该文件。注意,此文件只包含所有已知的全局 DNS 服务器,而不包含针对特定网络接口设置的 DNS 服务器。注意,应用程序不应该直接使用 /run/systemd/resolve/resolv.conf 文件, 而应该继续使用 /etc/resolv.conf 文件(指向它的软连接)。这样,未使用本地 D-Bus DNS API 的客户端,也将同时绕开 systemd-resolved 服务,直接与已知的全局 DNS 服务器通信。
  • 由其他软件包或系统管理员维护 /etc/resolv.conf 的内容。 在这种情况下,systemd-resolved 将会从中读取全局 DNS 配置。也就是说,systemd-resolved 只是一个 /etc/resolv.conf 文件的使用者,而非此文件的提供者。

使用哪个模式完全取决于 /etc/resolv.conf 是否为软连接,以及该软连接指向的目标。不需要特别的配置。

4. 时间管理 timedatectl

执行 timedatectl 可以看到系统目前的时间设定:

               Local time: Sat 2020-04-18 04:54:50 CST
           Universal time: Fri 2020-04-17 20:54:50 UTC
                 RTC time: Fri 2020-04-17 12:54:52
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no

timedatectl list-timezones 列出所有的时区,并且找到需要的那个:

…
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
…

最后 timedatectl set-timezone Asia/Shanghai 设定时区,设定完成后会自动对时。

5. 主机名管理 hostnamectl

主机名分 3 类: static (静态主机名), pretty (好看、易读的主机名) 和 transient (临时的)。和主机名有关的文件为 /etc/hostname,它是在系统初始化的时候被读取的,并且内核根据它的内容设置 transient 主机名。

  • static 主机名由 /etc/hostname 文件决定
  • pretty 主机名用来展示给用户。它可以提供非标准的主机名,它可以包含特殊符号,例如空格。例如将 pretty 名称命为 "LSZ's Host"
  • transient 主机名由内核动态维护。默认情况下,系统启动时会将 transient 主机名初始化为 /etc/hostname 文件中存储的主机名

/etc/hostname 文件中的 static 主机名即时、永久生效。修改后执行 hostname 或者 uname -n 可以直接获取到,重启后也按照此文件的主机名进行初始化。

/etc/hostname 文件中没有存储主机名时,系统启动过程中内核会将 transient 主机名初始化为 localhost.localdomain

RedHat 系系统的 /etc/sysconfig/network 文件中设置的主机名不再生效。

  • hostname 命令修改的是 transient 主机名,即临时生效的主机名
  • 修改 /etc/hostname 文件瞬时生效,重启后也生效 (内核会文件内容初始化 transient 主机名)。
  • RedHat 系系统上默认安装的 nmtui 命令可以以命令行图形化界的方式面修改主机名。命令直接修改 /etc/hostname 文件
  • 使用 hostnamectl 命令。它可以修改并查看三种主机名。当它修改 static 主机名时,直接将结果写入 /etc/hostname 文件

查看主机名:

hostnamectl
# 或
hostnamectl status
# 或
hostnamectl [--pretty | --static | --transient] status

设置主机名:

hostnamectl [--pretty | --static | --transient] set-hostname <name>

在修改了 pretty 主机名时,将取 pretty 名的简化部分作为 static 和 transient 主机名。

给设置主机名的命令传递一个空的字符串 hostnamectl set-hostname "" 可以将主机名重设为默认值。



Last Update: 2023-10-16 Mon 10:35

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: [email protected]

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议